AWS Lambda
バージョニング
TL;DR
イベントソースが Lambda の ARN を参照する場合は、非修飾 ARN を参照させるよりも、専用のエイリアスを作成してそれを参照させた方が良い
ロールバックが簡単
複数の依存 (dev/test/prod) が 1 つの Lambda 関数にある場合に、その管理が容易
バージョニングとエイリアス
AWS Lambda には、ある Lambda 関数に対して複数のバージョンを発行する機能がある。これによって、開発、テスト、本番環境用に Lambda 関数のバージョンを切り替える、といったことができる。 また、バージョンに エイリアスを発行する機能も存在する。エイリアスは特定の ARN と一意に紐づく。ただし、バージョンはイミュータブルであるのに対してエイリアスはミュータブルであり、エイリアスのさすバージョンは後ほど変更することができる。
AWS Lambda の ARN
Lambda 関数を表現する ARN には、以下の種類がある。
修飾 ARN (Qualified ARN)
末尾にバージョン情報が付加された ARN
特定のバージョンの Lambda 関数を指定したい場合に利用
arn:aws:lambda:aws-region:acct-id:function:helloworld:2
ただし、ここでバージョンではなく、エイリアスを利用することもできる
arn:aws:lambda:aws-region:acct-id:function:helloworld:PROD
非修飾 ARN (Unqualified ARN)
バージョン情報を付加しない ARN
$LATEST というバージョンで表現される
arn:aws:lambda:aws-region:acct-id:function:helloworld
エイリアスが有用なのは、例えば 1 つの Lambda 関数を、dev/test/prod として利用する場合。例えば、dev/test/prod という三つのエイリアスが存在し、現在 Lambda のバージョンが 10 の場合。
Lambda の dev/test/prod 用のイベントソース (S3 や API Gateway など) は、各々のエイリアスの Lambda 関数の修飾 ARN を指すようにする。dev 用の S3 は arn:aws:lambda:aws-region:acct-id:function:helloworld:DEV, test 用の S3 は arn:aws:lambda:aws-region:acct-id:function:helloworld:TEST, prod 用の S3 は arn:aws:lambda:aws-region:acct-id:function:helloworld:PROD を指している。
しかし、実際には全てバージョン 10 (arn:aws:lambda:aws-region:acct-id:function:helloworld:10) を指している。
code:graph
dev S3 -> arn:dev -> arn:10
test S3 -> arn:test -> arn:10
prod S3 -> arn:prod -> arn:10
ここで、Lambda のバージョンを 11 にあげたい。が、いきなり全ての環境を切り替えるわけにはいかない。ので、まずは 11 をデプロイしてから、dev エイリアスの向き先だけ 11 に向け、テストを行う。
code:graph
dev S3 -> arn:dev -> arn:11
test S3 -> arn:test -> arn:10
prod S3 -> arn:prod -> arn:10
問題なければ、順に test, prod をあげていく、といった使用の仕方ができる。
逆に、Lambda 関数をロールバックしたい場合も同様で、イベントソース (上記の例の場合は S3) が PROD エイリアスを向いていれば、エイリアスがさすバージョンを切り替えるだけでロールバックが行える。ただし、イベントソースが非修飾 ARN を指していた場合は、これが行えない。
Node.js 8.10
lambda が async/await をサポートするようになった。
code:javascript
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
exports.handler = (event, context, callback) => {
let getAccountSettingsPromise = lambda.getAccountSettings().promise();
getAccountSettingsPromise.then(
(data) => {
callback(null, data);
},
(err) => {
console.log(err);
callback(err);
}
);
};
code:javascript
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
exports.handler = async (event) => {
return await lambda.getAccountSettings().promise() ;
};